﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;


namespace SISTEMA_MK
{
           
    public class Dados
    {

        #region Variáveis Constantes

        // Variável que receberá a string de conexão
        public string strConexao = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

        // Variávies constantes que conterão as instruções SQL para o CRUD
        public const string strDelete = "DELETE FROM CLIENTE WHERE IdCliente = @IdCliente";
        public const string strInsert = "INSERT INTO CLIENTE VALUES" +
            "(@CPF, @Nome, @Endereco, @TeleFixo, @TeleCel, @Email, @Sexo, @Ativo," +
            "@DataCadastro)";
        public const string strSelect = "SELECT IdCliente, CPF, Nome, Endereco, TeleFixo," +
            "TeleCel, Email, Sexo, Ativo, DataCadastro FROM CLIENTE";
        public const string strUpdate = "UPDATE CLIENTE SET CPF = @CPF, Nome = @Nome," +
            "Endereco =  @Endereco, TeleFixo = @TeleFixo, TeleCel = @TeleCel," +
            "Email = @Email, Sexo = @Sexo, Ativo = @Ativo, DataCadastro = @DataCadastro" +
            "WHERE IdCliente = @IdCliente";

        // Para se pular a linha no meio de uma instrução basta 'cortá-la' com "" (duas aspas duplas) e entre 
        //      as aspas duplas adicionar o +.

        // Optei pelo uso da PARAMETRIZAÇÃO (Ex: @CPF, Nome = @Nome), caracterizado pelo uso do "@" pois ela é uma boa
        //      prática de programação. Pois se ao invés de usarmos a parametrização optarmos por usar a concatenação
        //      (Ex: "SELECT * FROM CLIENTE WHERE IdCliente = " + tbNome.Text) o usuário pode usar o que se chama de 
        //      "SQL INJECTION" e pode digitar um comando em linguagem SQL dentro da textbox. Esse comando ao ser lido pela 
        //      aplicação pode ser executado e assim causar sérias falhas no sistema.
        //      Por exemplo, se numa aplicação com o código ("SELECT * FROM CLIENTE WHERE IdCliente = " + tbNome.Text)
        //       o usuário digitar "DROP TABLE algumacoisa" a aplicação poderá interpretar aquilo com um comando SQL 
        //      e ao executar o mesmo alguma tabela do banco pode ser excluída / perdida!


        #endregion

        public class CLIENTE
        {

            public int IdCliente { get; set; }
            public string CPF { get; set; }
            public string Nome { get; set; }
            public string Endereco { get; set; }
            public string TeleFixo { get; set; }
            public string TeleCel { get; set; }
            public string Email { get; set; }
            public string Sexo { get; set; }
            public bool Ativo { get; set; }
            public DateTime DataCadastro { get; set; }

        }

        #region Métodos

                
        public void Atualizar(int IdCliente, string CPF, string Nome, string Endereco, string TeleFixo, string TeleCel, string Email, string Sexo, bool Ativo, DateTime DataCadastro)
        {
            using (SqlConnection objConexao = new SqlConnection(strConexao))
            {
                using (SqlCommand objCommand = new SqlCommand(strUpdate, objConexao))
                {
                    objCommand.Parameters.AddWithValue("@IdCliente", IdCliente);
                    objCommand.Parameters.AddWithValue("@CPF", CPF);
                    objCommand.Parameters.AddWithValue("@Nome", Nome);
                    objCommand.Parameters.AddWithValue("@Endereco", Endereco);
                    objCommand.Parameters.AddWithValue("@TeleFixo", TeleFixo);
                    objCommand.Parameters.AddWithValue("@TeleCel", TeleCel);
                    objCommand.Parameters.AddWithValue("@Email", Email);
                    objCommand.Parameters.AddWithValue("@Sexo", Sexo);
                    objCommand.Parameters.AddWithValue("@Ativo", Ativo);
                    objCommand.Parameters.AddWithValue("@DataCadastro", DataCadastro);

                    objConexao.Open();

                    objCommand.ExecuteNonQuery();
                    // esse método é usado para as instruções de INSERT, UPDATE e DELETE.

                } objConexao.Close();

            }

        }


        public List<CLIENTE> Consultar()
        {
            List<CLIENTE> lstCLIENTE = new List<CLIENTE>();

            using (SqlConnection objConexao = new SqlConnection(strConexao))
            {
                using (SqlCommand objCommand = new SqlCommand(strSelect, objConexao))
                {
                    objConexao.Open();

                    SqlDataReader objDataReader = objCommand.ExecuteReader();

                    if (objDataReader.HasRows)
                    {
                        while (objDataReader.Read())
                        {
                            CLIENTE objClientes = new CLIENTE();
                            objClientes.IdCliente = Convert.ToInt32(objDataReader["IdCliente"].ToString());
                            objClientes.CPF = objDataReader["CPF"].ToString();
                            objClientes.Nome = objDataReader["Nome"].ToString();
                            objClientes.Endereco = objDataReader["Endereco"].ToString();
                            objClientes.TeleFixo = objDataReader["TeleFixo"].ToString();
                            objClientes.TeleCel = objDataReader["TeleCel"].ToString();
                            objClientes.Email = objDataReader["Email"].ToString();
                            objClientes.Sexo = objDataReader["Sexo"].ToString();

                            if (objDataReader["Ativo"].ToString().Equals("0"))
                            {
                                objClientes.Ativo = false;
                            }
                            else
                            {
                                objClientes.Ativo = true;
                            }

                            objClientes.DataCadastro = Convert.ToDateTime(objDataReader["DataCadastro"].ToString());
                            lstCLIENTE.Add(objClientes);
                        }

                        objDataReader.Close();
                    }


                    objConexao.Close();
                }

            }


            return lstCLIENTE;

        }


        public void Excluir(int IdCliente)
        {
            using (SqlConnection objConexao = new SqlConnection(strConexao))
            {
                using (SqlCommand objCommand = new SqlCommand(strDelete, objConexao))
                {
                    objCommand.Parameters.AddWithValue("@IdCliente", IdCliente);

                    objConexao.Open();

                    objCommand.ExecuteNonQuery();
                    // esse método é usado para as instruções de INSERT, UPDATE e DELETE.

                    objConexao.Close();
                }
            }
                       
        }
        


        public void Gravar(string CPF, string Nome, string Endereco, string TeleFixo, string TeleCel, string Email, string Sexo, bool Ativo, DateTime DataCadastro)
        {
            using (SqlConnection objConexao = new SqlConnection(strConexao))
            { 
                using (SqlCommand objCommand = new SqlCommand(strInsert, objConexao))
                {
                    objCommand.Parameters.AddWithValue("@CPF", CPF);
                    objCommand.Parameters.AddWithValue("@Nome", Nome);
                    objCommand.Parameters.AddWithValue("@Endereco", Endereco);
                    objCommand.Parameters.AddWithValue("@TeleFixo", TeleFixo);
                    objCommand.Parameters.AddWithValue("@TeleCel", TeleCel);
                    objCommand.Parameters.AddWithValue("@Email", Email);
                    objCommand.Parameters.AddWithValue("@Sexo", Sexo);
                    objCommand.Parameters.AddWithValue("@Ativo", Ativo);
                    objCommand.Parameters.AddWithValue("@DataCadastro", DataCadastro);

                    objConexao.Open();

                    objCommand.ExecuteNonQuery();
                    // esse método é usado para as instruções de INSERT, UPDATE e DELETE.

                    objConexao.Close();
                }
            }
        }

        #endregion
    }
}
